package java_thinking.unit_18_IO._18_10;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @Desc:   内存映射文件:允许我们创建和修改那些因为太大而不能放入内存的文件，有了内存映射文件，我们就可以假定整个文件
 *          都放在内存中，而且可以完全把它当做非常大的数组来访问，简化了用于修改文件的代码；
 *          RandomAccessFile :为了既能读又能写
 *          MappedByteBuffer：继承自 ByteBuffer 的特殊类型直接缓冲器,除了put和get也可以asCharBuffer
 *          注意：必须指定映射文件的出事位置和映射区域的长度，这意味着我们可以映射某个大文件的较小部分
 * @author: cww
 * @DateTime: 2019/5/17 20:47
 */

public class LargeMappedFiles {
    //128M
    static int length = 0x8FFFFFF;
    static String file = "D:\\FFOutput\\00_01_25-00_03_47.mp4";
    public static void main(String[] args) throws IOException {
        MappedByteBuffer out = new RandomAccessFile(file, "rw")
                .getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);
//        for (int i = 0; i < length; i++) {
//            out.put((byte) 'x');
//        }
        System.out.println("Finished writing");
        for (int i = length/2; i < length/2 +6; i++) {
            System.out.println((char)out.get(i));
        }
    }
}
